
// 布尔值
let isDone: boolean = false;




// 数字 十进制
let num: number = 123
// 十六进制
let hexLiteral: number = 0xf00d;
//二进制
let binaryLiteral: number = 0b1010;
//八进制
let octalLiteral: number = 0o744;


// 字符串
let str: string = ""


// 数组
let arr1: number[] = [1,2,3]
let arr2: Array<number> = [1,3,4]


// 元祖

let o1:[number,string] = [1,"1"]
// 只能操作相应的
console.log(o1[1].substring(1))
// console.log(o1[0].substring(1)) // 报错


// 可选类型
let a1: string|boolean = "1"
a1 = true


//枚举
//默认情况下，从0开始为元素编号。 你也可以手动的指定成员的数值。 例如，我们将上面的例子改成从 1开始编
enum Color {
    green,
    red=12,
    yellow
}
let c1: Color = Color.green
let cn:String = Color[0]
console.log(c1)//0
console.log(Color.yellow)//13
console.log(cn)//green //因为编号为0的元素为green


// any类型
let any1: any = 123
any1 = "11a"
// any1下的fn方法可能存在，但ts并不会作检查
// any1.fn()



// 任意类型的数组
let anyArr:any[] = [1,"2",{}]


// object类型
let obj1:Object = {}

let nn:number = 21



// Null 和 Undefined

// 启用 --strictNullChecks
let x: number;
x = 1; // 运行正确
// x = undefined;    // 运行错误
// x = null;    // 运行错误

// 启用 --strictNullChecks
let y: number|undefined|null;
y = 1; // 运行正确
y = undefined;    // 运行错误
y = null;    // 运行错误


// never 类型
try{
    let nv1: never = (() => {
        throw new Error('exception')
    })();
}catch (e) {

}

let nv2 = (()=>{
    for (let i = 0; i < 2; i++) {

    }
})

let b1:string;
// console.log(b1)//ts报错 结果undefined


//类型转换
let str0:string = '1'
let num0:number = <number><any>str0
console.log(num0)//1

let str1:string = '1a'
let num1:number = <number><any>str1
console.log(num1)//1a


// void
let v1:void = undefined
console.log(v1)
// v1=null
// let v2:void = null
// console.log(v2)




// object
// object表示非原始类型，也就是除number，string，boolean，symbol，null或undefined之外的类型

declare function create1(o: object | null): void;

create1({ prop: 0 }); // OK
create1(null); // OK

// create(42); // Error
// create("string"); // Error
// create(false); // Error
// create(undefined); // Error



// 类型断言
let someValue: any = "this is a string";

let strLength:number = someValue.length
let strLength1: number = (<string>someValue).length;

let strLength2:number = (someValue as string).length


console.log(strLength,strLength1,strLength2)











